/* common js 公共函数库 */
/**
 * 弹出返回提示框
 * @author DZQ
 * @param {Object} config - 配置参数
 * @param {String} config.title - 提示框标题
 * @param {String} config.content - 提示框内容
 * @param {String} config.showCancel - 是否显示取消按钮
 */
const showBackModal = function (config) {
    let { title = '', content = '返回上一页？', showCancel = true } = config
    mpvue.showModal({
        title,
        content,
        showCancel,
        confirmText: '返回',
        success: (res) => {
            if (res.confirm) {
                mpvue.navigateBack()
            }
        }
    })
}

/**
 * 对象是否为空
 * @param {Object} obj
 */
const isEmpty = function (obj) {
    return (typeof obj === "undefined" || obj == null || obj === "")
}

/**
 * 数据列表对象去重 对象必须包含ID属性
 * @param {Object} arr
 */
const distinct = function (arr) {
    let result = []
    let obj = {}
    for (let item of arr) {
        if (!obj[item.id]) {
            result.push(item)
            obj[item.id] = true
        }
    }
    return result
}

/**
 * 自动补全
 * @author DZQ
 * @param {Integer} value 需要补全的数字
 * @param {Integer} number 返回的位数
 */
const paddingZero = function (value, number) {
    return ('0000000' + value).slice(-number)
}

/**
 * 格式化时间
 * @author DZQ
 * @function formatTime 格式化时间
 * @param {Date} date 需要被格式化的时间对象
 * @param {String} format 格式 {
 *     yyyy 表示年
 *     [MM | M] 表示月 [ 两位数字 | 一或两位数字 ]
 *     [dd | d] 表示日 [ 两位数字 | 一或两位数字 ]
 *     [HH/hh | H/h] 表示时 [ 两位数字 | 一或两位数字 ]
 *     [mm | m] 表示分 [ 两位数字 | 一或两位数字 ]
 *     [ss | s] 表示秒 [ 两位数字 | 一或两位数字 ]
 * }
 * @return {String} 返回被格式化的时间文本
 */
const formatTime = function (date = (new Date()), format = '') {
    let y = date.getFullYear()
    let MM = paddingZero(date.getMonth() + 1, 2)
    let dd = paddingZero(date.getDate(), 2)
    let hh = paddingZero(date.getHours(), 2)
    let mm = paddingZero(date.getMinutes(), 2)
    let ss = paddingZero(date.getSeconds(), 2)
    if (format === '') {
        return `${y}/${MM}/${dd} ${hh}:${mm}:${ss}`
    } else {
        let dateString = format
        if (/yyyy/.test(format)) { dateString = dateString.replace('yyyy', y) }
        if (/MM/.test(format)) { dateString = dateString.replace('MM', MM) }
        if (/M/.test(format)) { dateString = dateString.replace('M', date.getMonth() + 1) }
        if (/dd/.test(format)) { dateString = dateString.replace('dd', dd) }
        if (/d/.test(format)) { dateString = dateString.replace('d', date.getDate()) }
        if (/HH/.test(format) || /hh/.test(format)) {
            dateString = dateString.replace('HH', hh)
            dateString = dateString.replace('hh', hh)
        }
        if (/H/.test(format) || /h/.test(format)) {
            dateString = dateString.replace('H', date.getHours())
            dateString = dateString.replace('h', date.getHours())
        }
        if (/mm/.test(format)) { dateString = dateString.replace('mm', mm) }
        if (/m/.test(format)) { dateString = dateString.replace('m', date.getMinutes()) }
        if (/ss/.test(format)) { dateString = dateString.replace('ss', ss) }
        if (/s/.test(format)) { dateString = dateString.replace('s', date.getSeconds()) }
        return dateString
    }
}

/**
 * 上传方法
 * @author DZQ
 * @param {Object} actionUrl 上传的服务器地址
 * @param {Object} filesList 需要上传的路径列表
 * @param {function} progressCallback 监听上传进度 返回四个值 progress,totalProgress,current,total 当前进度百分比，总进度百分比，当前第几个任务，总任务数
 * @param context 上下文对象
 */
const uploadFiles = function (actionUrl, filesList, progressCallback = () => { }, context) {
    let current = 1
    let promises = filesList.map(file => {
        let path = ''
        if (typeof file === 'string'){
            path = file
        } else {
            path = file.path
        }
        return new Promise((resolve, reject) => {
            let uploadTask = wx.uploadFile({
                url: actionUrl,
                filePath: path,
                header: {
                    Authorization: "Bearer " + wx.getStorageSync('access_token'),
                    Tenant: wx.getStorageSync('tenantId') || 0
                },
                name: "file",
                success: res => {
                    if (typeof file === 'string'){
                        // 兼容旧的写法
                        resolve(JSON.parse(res.data));
                    } else {
                        // 新的方式
                        let data = JSON.parse(res.data)
                        Object.assign(data.result, {
                            tempName: file.name || '',
                            tempPath: file.path || '',
                            tempSize: file.size || 0,
                            tempTime: file.time || 0,
                            tempType: file.type || ''
                        })
                        resolve(data);
                    }
                },
                fail: error => {
                    reject(error);
                }
            });
            uploadTask.onProgressUpdate(({ progress }) => {
                progressCallback(progress / 100, (progress / 100) * (current / filesList.length), current, filesList.length, context)
                if (progress === 100) { current++ }
            })
        });
    });
    return Promise.all(promises);

}
/**
 * 选择聊天文件
 * @author DZQ
 * @param {Number} count 可以上传的总数
 * @param {String} type 允许的类型 【all：从所有文件选择、 video：只能选择视频文件、 image：只能选择图片文件、 file：可以选择除了图片和视频之外的其它的文件】
 */
const chooseMessageFile = function (count = 9, type = 'file') {
    return new Promise((resolve, reject) => {
        wx.chooseMessageFile({
            count: count,
            type: 'file',
            success: (res) => {
                /**
                 * tempFiles 返回的是一个包含文件对象的数组
                 * [{
                 *     name: '文件名',
                 *     path: 'wxfile://.ext', // 微信临时文件路径
                 *     size: 76447087, // b为单位 ÷1024则为kb
                 *     type: 'file', // 文件类型
                 *     time: number, // 十位数字 上传的时间戳 单位s
                 * }]
                 */
                // wx.showToast({
                //     title: `选中${res.tempFiles.length}个文件，如果选中的文件未上传，则表示本地文件不存在`,
                //     icon: 'none',
                //     mask: true,
                //     duration: 3000
                // })
                resolve(res.tempFiles)
            },
            fail: error => {
                reject(error)
            }
        })
    })
}
/**
 * 预览文件
 * @author DZQ
 * @function fileUrl - 文件的路径列表
 */
const previewFile = function (fileUrl) {
    let [pathUrl] = fileUrl.split(".").splice(-1);
    let allowExName = ["xls", "xlsx", "doc", "docx", "pdf", "ppt", "pptx"]
    if (allowExName.indexOf(pathUrl) === -1) {
        wx.showToast({
            title: "文件格式只支持" + allowExName + "!",
            icon: "none"
        });
    } else {
        return new Promise((resolve, reject) => {
            wx.showLoading({title:'加载中...',mask:true})
            wx.downloadFile({
                url: fileUrl,
                success: (res) => {
                    if (res.statusCode === 200) { //成功
                        let Path = res.tempFilePath //返回的文件临时地址，用于后面打开本地预览所用
                        console.info(Path,'预览数据')
                        wx.openDocument({
                            filePath: Path, //要打开的文件路径
                            fileType: pathUrl,
                            success: (ok) => {
                                wx.hideLoading()
                                resolve(ok)
                            }
                        })
                    }
                },
                fail: (err) => {
                    wx.hideLoading()
                    console.info(err,'文件打开失败')
                    reject(err)
                }
            })
        })
    }
}

/**
 * 获取今天跟明天
 */
const getDates = (today, state = true) => {
    const year = today.getFullYear();
    const month = today.getMonth() + 1;
    let day = today.getDate().toString();
    day.length === 1 ? day = '0' + day : '';
    if (state) {
        return year + '年' + month + '月' + day + '日';
    } else {
        return year + '-' + month + '-' + day;
    }
}

/***
 *获取当天是星期几 
 * 
 */
const getWeek = function (weeks) {
    let tody = weeks.split('-');
    tody = tody.join('/');
    var date = new Date(tody);
    var day = date.getDay();
    var weeks = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
    var week = weeks[day];
    return week;
}
/***
 * 获取文件大小
 * 
 */
const fileSize = function(ele){
    ele.forEach((item)=>{
        return new Promise((resolve)=>{
            wx.downloadFile({
                url: item.url,
                success: (result) => {
                    const { tempFilePath } = result;
                    item.url = tempFilePath
                    wx.getFileInfo({
                        filePath: tempFilePath,
                        success: (res => {
                            const { size } = res;
                            const filesSize = Math.round(size / 1024 / 1024 * 100) / 100 // 单位为M
                            item.size = filesSize;
                            resolve(ele)
                        })
                    })
                }
            });
        })
    })
}


/**
 * @author DZQ
 * @function getRelativeDate - 获取相对日期
 * @param {object | number} [date = today] - 相对于哪一天 默认今天
 * @param {number} [vi=0] - 偏移 0 表示今日 -1 表示前一天 1 表示后一天
 * @param {string} [connector='-'] - 链接符 如果为date则为年月日
 * @return {string} YYYY-MM-DD - 返回形式
 */
const getRelativeDate = function (date = new Date(), vi = 0, connector = '-') {
    // 从时间戳获取时间
    let r_date = new Date((typeof date === 'number' ? date : date.getTime()) + vi * 86400000)
    if (connector === 'date') {
        return r_date.getFullYear() + '年' + paddingZero(r_date.getMonth() + 1, 2) + '月' + paddingZero(r_date.getDate(), 2) + '日'
    } else {
        return r_date.getFullYear() + connector + paddingZero(r_date.getMonth() + 1, 2) + connector + paddingZero(r_date.getDate(), 2)
    }
}

/**
 * @author DZQ
 * @function getWeekList - 获取指定开始和结束日期的周列表
 * @param {object} [startDate= today] 开始的时间
 * @param {object} [endDate= today] 结束的时间
 * @return {Array} 周日期数组
 */
const getWeekList = function (startDate = new Date(), endDate = new Date()) {
    let _startDate = startDate.getTime() < endDate.getTime() ? startDate : endDate
    let _endDate = startDate.getTime() <= endDate.getTime() ? endDate : startDate
    let list = []
    // 时间戳
    let s_unix = _startDate.getTime() + (1 - (_startDate.getDay() || 7)) * 86400000 // 开始时间的那一周的开始一天
    let _e_unix = _endDate.getTime() + (7 - (_endDate.getDay() || 7)) * 86400000 // 结束时间的那一周的最后一天
    let w = Math.ceil((_e_unix - s_unix) / 604800000) // 一共几个星期
    for (let i = 0; i < w; i++) {
        list.push(getRelativeDate(s_unix, 7 * i) + ' 至 ' + getRelativeDate(s_unix, 7 * i + 6))
    }
    return list
}

/**
 * @author DZQ
 * @function removeEmptyValueFromObject - 移除对象中值为空的属性
 * @param {object} object 需要操作的对象
 * @return {object} 返回去除空值后的对象
 */
const removeEmptyValueFromObject = function (object = {}) {
    let result = JSON.parse(JSON.stringify(object)) // 拷贝对象，防止引用
    for (let res_key in result) {
        if (result.hasOwnProperty(res_key) && (result[res_key]===null || result[res_key]===undefined || result[res_key]==='')) {
            delete result[res_key] // 去除对象内多余的空值key
        }
    }
    return result
}

export {
    showBackModal,
    isEmpty,
    distinct,
    paddingZero,
    formatTime,
    chooseMessageFile,
    uploadFiles,
    previewFile,
    getDates,
    getRelativeDate,
    getWeekList,
    getWeek,
    fileSize,
    removeEmptyValueFromObject,
}